package algorithm_primary.studyClass.新手课程.单链表.one;

/**
 * @author 衡孟浩
 * @date 2023/5/28 10:27
 */
public class MainTest {
    public static void main(String[] args) {
        Node initNode = createInitNode();
        //System.out.println("第一次"+initNode);
//        while (initNode != null) {
//            System.out.print("initNode:" + initNode.value + "  ");
//            initNode = initNode.next;
//        }
//        System.out.println(initNode.value);
        Node node = reverseNode(initNode);
        while (node != null) {
            System.out.print("node:" + node.value + "  ");
            node = node.next;
        }
//        System.out.println(initNode.value);

    }


    /**
     * 反转单链表的只想   可以看到下边的createNode已经生成了一个单向链表    node1 -> node2 -> node3 -> null
     * 那么这个方法如果反转以后就会出现  null <- node1 <- node2 <- node3
     * @param initNode
     * @return
     */
    private static Node reverseNode(Node initNode) {
        // pre 代表反转之前每个node节点的上级node节点   第一个节点特殊  因为  node3反转之前是 -> null的   所以我们在给node1反转的时候  pre 要是null  所以pre初始是null
        // next  代表 反转之前的下一个node
        // pre代表反转之前的上一个节点   next代表下一个节点
        Node pre = null,next = null;
        while (initNode != null){
            // 记下来反转之前的下一个节点
            next = initNode.next;
            // 将当前节点的指针指向反转之前的上一个节点   也就是 比如 当前节点是  node2
            // 反转之前他的上一个节点是 node1 也就是 nodde1 -> node2 -> node3 那么pre = node1
            // 这时候将node2的下一个节点设置为pre 就会出现  node1 <- node2实现了反转
            initNode.next = pre;
            //将当前的接待你记下来给pre  是为了操作 node3的时候找到反转之前  node3的上一个几点  这样node3就可以只想node2
            pre = initNode;
            // 将下一个节点给当前节点  接着便利  这样当前节点如果是 node2  那么这时候就应该操作node3了
            initNode = next;
        }
        return pre;
    }


    /**
     * 创建初始的单链表Node
     * 生成的链表为    node1 -> node2 -> node3 -> null   这里的node3指向的是null    null也是一个地址 只不过在我们的jvm中特殊的一个地址
     * 如果是这样的一个链表   根据jvm的可达性分析   如果根据node1可以找到node2然后node2可以找到node3这样是不会被认为是垃圾不会回收
     * 但是如果返回一个head是node3那么jvm会根据 node3找他引用了什么  发现node3的next是一个null这时候找不到node1和node2别引用会被当作垃圾处理掉
     *
     * @return
     */
    public static Node createInitNode() {
        Node node1 = new Node(1);
        node1.next = new Node(2);
        node1.next.next = new Node(3);
        return node1;
    }
}
